package com.rowenci.iot_agriculture.util.iot;

import com.rowenci.iot_agriculture.bean.iot.Com;
import com.rowenci.iot_agriculture.bean.iot.Message;
import com.rowenci.iot_agriculture.service.api.ComService;
import com.rowenci.iot_agriculture.service.api.MessageService;
import com.rowenci.iot_agriculture.util.iot.SerialUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 串口通讯工具（非阅读器串口）
 * </p>
 *
 * @author rowenci
 * @date 2019/4/16 19:01
 */
@Component
@Configuration      //1.主要用于标记配置类，兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class SerialTask {

    @Resource
    ComService comService;
    @Resource
    MessageService messageService;

    //3.添加定时任务
    @Scheduled(cron = "0/60 * * * * ?")
    //或直接指定时间间隔，例如：5秒
    //@Scheduled(fixedRate=5000)
    /**
     * 定时执行
     * 首先遍历数据库中的串口信息，再一个个打开（打开一个接受一个信息，接受完打开另一个，消息队列是阻塞形式的）
     * 得到的信息再传到数据库中（Message）
     */
    private void configureTasks() {

        //获取除了阅读器之外的串口
        List<Com> list = comService.findAllExceptReader();

        System.out.println(list);
        for (int j = 0; j < list.size(); j++) {
            Com tCom = list.get(j);
            if (tCom.getSensor() == "walker" || tCom.getSensor() == "alarm" ||
                    tCom.getSensor().equals("walker") || tCom.getSensor().equals("alarm")) {
                list.remove(j);
                j --;
            }
        }
        System.out.println(list);

        //list不为空时
        if (!list.isEmpty()){
            for (int i = 0; i < list.size(); i ++){
                //获取串口
                Com com = list.get(i);
                System.out.println(com);

                //初始化信息
                Message message = new Message();

                SerialUtil serialUtil = new SerialUtil();
                int code = serialUtil.startComPort(com);
                if (code == 1){
                    System.out.println("打开串口"+com.getComName()+"成功");
                    try {
                        while (true) {
                            // 如果堵塞队列中存在数据就将其输出
                            if (serialUtil.msgQueue.size() > 0) {
                                //取出数据
                                String info = serialUtil.bytesToHexString(serialUtil.msgQueue.take());
                                System.out.println(info);
                                message.setComId(com.getId());
                                message.setInfo(info);
                                //更新数据库中数据
                                messageService.updateMessage(message);
                                serialUtil.closeSerial();
                                break;
                            }
                        }
                        serialUtil.closeSerial();
                    } catch (InterruptedException e) {
                        serialUtil.closeSerial();
                        e.printStackTrace();
                    }
                }
            }
        }else {
            System.out.println("无其他串口");
        }

    }
}